extends Skill




## 技能范围
var rang: int = 2 # 范围
var igs: Array = [Vector2(0, 0)] # 忽略自己，防止给自己治疗
var mode := CreateGrid.CREATE_GRID_MODE.TILE_RANGE # 范围模式
## 技能效果
var recover: int = 2 # 治疗量
var target: Unit = null # 效果施加对象
## 技能发动代价
var cost_ep: int = 3
var cost_action_chance: int = 1




## 这个技能是一个选一定范围内的一个格子上的单位恢复HP
func start(_args: Dictionary = {}) -> void:
	# 获取游戏场景
	var sce: Scene = get_scene()
	var off := sce.map.local_to_map(_args["user"].position)
	var pos := GCreateGrid.create_grid(mode, rang, igs, off)
	var lpos = []
	
	for index in range(0, pos.size()):
		lpos.append(sce.map.map_to_local(pos[ index ]))
	
	# 生成格子
	sce.select_manage.show_range(
		lpos,
		SceneSelectManage.SelectMangerMode.SKILL,
		call_check,
		_args
	)



## 回调检查
func call_check(_args: Dictionary) -> bool:
	# 用回调的位置来判断是否有单位，有就增加HP
	var tp = _args["target_position"]
	# 在点击范围外的对方时，就取消这个技能的发动
	if  tp == null:
		return true
	
	# 如果点击了有效位置
	# 就判断位置上是否是一个 unit
	else:
		var sce: Scene = get_scene()
		var u = sce.unit_manage.get_position_units([tp])
		if not u.is_empty():
			target = u[0]
			_run()
		return true
	
	return false




## * 这个效果可以给任何 unit 进行治疗
## * 这个效果还可以给满血的 unit 进行治疗
func _run() -> void:
	# 支付代价
	var property: UnitProperty = master.master.property
	property.current_ep -= cost_ep
	property.action_chance -= cost_action_chance
	
	# 发挥效果
	target.property.current_hp += recover




## 检查代价
func cost() -> bool:
	if not is_instance_valid(master):
		return false;
	
	# 因为效果的父节点是 UnitSkill
	# 所以访问 Unit 的 master 来获取 unit
	var property: UnitProperty = master.master.property
	if  property.action_chance >= cost_action_chance and \
		property.current_ep >= cost_ep:
		return true;
	
	return false;
